package com.xzmzhp.dao.finance;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xzmzhp.dao.finance.SQL.FinanceStatisticsSql;
import com.xzmzhp.pojo.finance.FinanceStatistics;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * @author: 王源(xm)
 * @create: 2021-11-06 16:09
 * @program: ams
 * @description: 财务统计信息数据库交互类
 */
@Repository
public interface FinanceStatisticsMapper extends BaseMapper<FinanceStatistics> {

    /**
     * 查询所有财务统计信息
     *
     * @return 财务统计信息
     */
    @Select("select fstatistics_id,balance,expenses_total,income_total,creation_time from finance_statistics")
    List<FinanceStatistics> findAll();

    /**
     * 根据财务统计id查询财务统计信息
     *
     * @param fstatisticsId 财务统计id
     * @return 相关财务统计信息
     */
    @Select("select fstatistics_id,balance,expenses_total,income_total,creation_time from finance_statistics where fstatistics_id = #{fstatisticsId}")
    FinanceStatistics findFinanceStatisticsByFstatisticsId(@Param("fstatisticsId") Integer fstatisticsId);

    /**
     * 获取余额
     *
     * @param date 开始时间
     * @return 财务统计信息
     */
    @Select("select balance from finance_statistics where creation_time = #{date}")
    BigDecimal findBalance(@Param("date") Date date);

    /**
     * 根据时间获取信息
     *
     * @param date 开始时间
     * @return 财务统计信息
     */
    @Select("select fstatistics_id,balance,expenses_total,income_total,creation_time from finance_statistics where creation_time = #{date}")
    FinanceStatistics findFinanceStatisticsByDate(@Param("date") Date date);

    /**
     * 根据时间类型查询财务信息
     * @param dateType 时间类型
     * @return 月、年财务信息
     */
    @SelectProvider(type = FinanceStatisticsSql.class, method = "findFinanceStatisticsByDateType")
    List<FinanceStatistics> findFinanceStatisticsByDateType(@Param("dateType") Integer dateType);

    /**
     * 查询一段时间内的财务统计信息
     *
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 一段时间内的财务统计信息
     */
    @SelectProvider(type = FinanceStatisticsSql.class, method = "findFinanceStatisticsByDate")
    List<FinanceStatistics> countFinanceStatistics(@Param("startDate") Date startDate, @Param("endDate") Date endDate);


    /**
     * 修改财务统计信息
     * @param financeStatistics 财务信息
     * @return 是否成功
     */
    @UpdateProvider(type = FinanceStatisticsSql.class, method = "editFinanceStatistics")
    Integer editFinanceStatistics(FinanceStatistics financeStatistics);

    /**
     * 根据时间修改余额信息
     * @param changeAmount 变动金额
     * @param creationTime 创建时间
     * @return 是否成功
     */
    @Update("update finance_statistics set balance= (@balance + #{changeAmount}) where creation_time = #{creationTime}")
    Integer editBalanceByDate(@Param("changeAmount") BigDecimal changeAmount,@Param("creationTime") Date creationTime);
}
